﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net;
using Iudicium.Servicios;
using Iudicium.Transacciones.CRN;
using Iudicium.Servicio.CRN;
using Iudicium.Servicio;
using Iudicium.Tramites.CRN;
using System.Globalization;
using Iudicium.Archivos.CRN;
using Iudicium.Utilitarios;

public partial class Servicios_Transaccion_FormularioTransaccion : System.Web.UI.Page
{
    private static readonly ILog log = LogManager.GetLogger("LogFile");
    
    private int TransaccionId
    {
        set { TransaccionIdHiddenField.Value = value.ToString(); }
        get
        {
            int TransaccionId = 0;
            try
            {
                TransaccionId = Convert.ToInt32(TransaccionIdHiddenField.Value);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo convertir TransaccionIdHiddenField.Value a un valor entero", ex);
            }
            return TransaccionId;
        }
    }

    private int ServicioId
    {
        set { ServicioIdHiddenField.Value = value.ToString(); }
        get
        {
            int servicioId = 0;
            try
            {
                servicioId = Convert.ToInt32(ServicioIdHiddenField.Value);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo convertir ServicioIdHiddenField.Value a un valor entero", ex);
            }
            return servicioId;
        }
    }

    public string EstadoServicio
    {
        get { return EstadoServicioHiddenField.Value; }
    }

    protected string BackToUrl
    {
        set { BackToUrlHiddenField.Value = value; }
        get { return BackToUrlHiddenField.Value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ObtenerParametros();
        }
    }

    private void ObtenerParametros()
    {
        bool paramsComplete = false;
        if (Session["TransaccionId"] != null && !string.IsNullOrEmpty(Session["TransaccionId"].ToString()))
        {
            TransaccionIdHiddenField.Value = Session["TransaccionId"].ToString();
        }
        Session["TransaccionId"] = null;

        if (Session["ServicioId"] != null && !string.IsNullOrEmpty(Session["ServicioId"].ToString()))
        {
            ServicioIdHiddenField.Value = Session["ServicioId"].ToString();
            paramsComplete = true;
        }
        Session["ServicioId"] = null;

        if (Session["TransaccionBackToUrl"] != null && !string.IsNullOrEmpty(Session["TransaccionBackToUrl"].ToString()))
        {
            BackToUrl = Session["TransaccionBackToUrl"].ToString();
        }
        Session["TransaccionBackToUrl"] = null;

        if (paramsComplete && ServicioId > 0)
        {
            try
            {
                Servicio objServicio = ServicioCRN.GetServicioById(ServicioId);
                MinDateLiteral.Text = "new Date(" + objServicio.FechaInicio.Year + "," + (objServicio.FechaInicio.Month - 1)  + "," +
                    objServicio.FechaInicio.Day + ")";
            }
            catch (Exception ex)
            {
                log.Error("No se pudo obtener los datos del servicio " + ServicioId, ex);
            }
            
            CargarDatos();
        }
        else
            Redirect();
    }

    private void Redirect()
    {
        
        if (ServicioId > 0 && !string.IsNullOrEmpty(BackToUrl))
        {
            Session["TransaccionBackToUrl"] = BackToUrl;
            Session["ServicioId"] = ServicioId;
            Response.Redirect("~/Servicios/Transaccion/ListaTransacciones.aspx");
        }
        else
        {
            Response.Redirect("~/Default.aspx");
        }
    }

    private void CargarDatos()
    {
        Transaccion objTransaccion = null;
        try
        {
            objTransaccion = TransaccionCRN.GetTransaccionById(TransaccionId, ServicioId);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo obtener la Transaccion con id: " + TransaccionId, ex);
        }
        if (objTransaccion == null)
            return;
        EgresoRadioButton.Checked = objTransaccion.TipoTransaccion.Equals("Egreso") ? true : false;        
        IngresoRadioButton.Checked = !EgresoRadioButton.Checked;
        SelectedDateLiteral.Text = "new Date(" + objTransaccion.FechaTransaccion.Year + "," + (objTransaccion.FechaTransaccion.Month -1) + "," +
            objTransaccion.FechaTransaccion.Day + ");";
        DescripcionTextBox.Text = objTransaccion.Descripcion;
        MontoTextBox.Text = objTransaccion.Monto.ToString().Replace(",", ".");
        ServicioIdHiddenField.Value = objTransaccion.ServicioId.ToString();
        FechaLiteral.Text = objTransaccion.FechaTransaccion.ToShortDateString();
        FileUploader.Mode = UserControls_Uploader.ModeControl.Edit;
        FileUploader.ObjetoId = TransaccionId;
        try
        {

            Servicio.TipoServicio tipo = ServicioCRN.GetTipoServicioByServicioId(ServicioId);
            if (tipo == Servicio.TipoServicio.Tramite)
            {
                Tramite objTramite = TramiteCRN.GetTramiteById(ServicioId);
                EstadoServicioHiddenField.Value = objTramite.Estado;
            }
        }
        catch (Exception ex)
        {
            log.Error("No se pudo obtener los datos del servicio", ex);
        }
        if (!EstadoServicio.Equals("En Proceso"))
        {
            MontoTextBox.ReadOnly = true;
            DescripcionTextBox.ReadOnly = true;
            FechaLiteral.Visible = true;
            FechaTextBox.Visible = false;
            HelpImage.Visible = false;
            GuardarLinkButton.Visible = false;
            CancelarLinkButton.Text = "Volver";
            TipoTransaccionLiteral.Text = IngresoRadioButton.Checked ? "Ingreso" : "Egreso";
            IngresoRadioButton.Visible = EgresoRadioButton.Visible = false;
            TipoTransaccionLiteral.Visible = true;
            FileUploader.Mode = UserControls_Uploader.ModeControl.Readonly;
        }
    }

    protected void GuardarLinkButton_Click(object sender, EventArgs e)
    {
        int ServicioId = 0;
        try
        {
            ServicioId = Convert.ToInt32(ServicioIdHiddenField.Value);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo obtener el ServicioId", ex);
        }

        decimal monto = 0;
        try
        {
            monto = Convert.ToDecimal(MontoTextBox.Text.Replace(" ", "").Replace(".",","));
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir ontoTextBox.Text a un valor double", ex);
        }
        DateTime fechaTransaccion =  DateTime.Now;
        try
        {
            fechaTransaccion = Convert.ToDateTime(FechaTextBox.Text);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo convertir FechaTextBox.Text a un valor datetime", ex);
        }

        Transaccion objTransaccion = new Transaccion(TransaccionId, ServicioId, IngresoRadioButton.Checked ? "Ingreso" : "Egreso", fechaTransaccion, DescripcionTextBox.Text, monto,0);
        if (TransaccionId == 0)
        {
            try
            {
                TransaccionId = TransaccionCRN.InsertTransaccion(objTransaccion);
                InsertarArchivos(FileUploader.ArchivosSeleccionados, ServicioId);
                Iudicium.Utilitarios.Notificacion.MostrarNotificacion(
                    "El registro de la Transaccion se realizó correctamente.",
                    Iudicium.Utilitarios.Notificacion.TipoNotificacion.Alert);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo insertar la Transaccion", ex);
                Iudicium.Utilitarios.Notificacion.MostrarNotificacion(
                    "El registro de la Transaccion no se pudo completar correctamente.",
                    Iudicium.Utilitarios.Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return;
            }
        }
        else
        {
            try
            {
                TransaccionCRN.UpdateTransaccion(objTransaccion);
                InsertarArchivos(FileUploader.ArchivosSeleccionados, ServicioId);
                EliminarArchivos(FileUploader.ArchivosEliminados);
                Iudicium.Utilitarios.Notificacion.MostrarNotificacion(
                    "Los datos de la Transaccion se editaron correctamente.",
                    Iudicium.Utilitarios.Notificacion.TipoNotificacion.Alert);
            }
            catch (Exception ex)
            {
                log.Error("No se pudo actualizar los datos de la Transaccion", ex);
                Iudicium.Utilitarios.Notificacion.MostrarNotificacion(
                    "Los datos de la Transaccion no se pudieron editar correctamente.",
                    Iudicium.Utilitarios.Notificacion.TipoNotificacion.Error);
                ControlNotificacion.Update();
                return;
            }
            
        }
        Redirect();
    }

    private void InsertarArchivos(List<int> archivos, int servicioId)
    {
        if (archivos.Count == 0)
            return;
        try
        {
            ArchivoCRN.InsertarRelacionArchivo(archivos, TransaccionId, Iudicium.Archivos.TipoRelacionArchivo.Transaccion, servicioId);
        }
        catch (Exception ex)
        {
            log.Error("No se pudo cargar los archivos adjuntos para la transaccion", ex);
        }
    }

    private void EliminarArchivos(List<int> archivos)
    {
        foreach (int id in archivos)
        {
            Utilitarios.EliminarArchivo(id);
        }
    }

    protected void CancelarLinkButton_Click(object sender, EventArgs e)
    {
        Redirect();
    }
}
